#include "dag.h"
#include "dag_operators.h"

using namespace dag;
using namespace std;

MultOp::MultOp(const Frame& mul)
:	m_Mult(mul)
{
}

MultOp::~MultOp() throw() {
}

auto_ptr<FrameOperator> MultOp::inflate(istream& bStream) {
	Frame frame = FrameSpec();
	frame.load(bStream);
	return auto_ptr<FrameOperator>(new MultOp(frame));
	
}

void MultOp::operate(const Frame& input, Frame& output) {
	if (static_cast<const FrameSpec&> (input) != 
		static_cast<const FrameSpec&> (m_Mult)) {
		throw UnequalFrameSpec(input, m_Mult);
	}
	
	output = input;
	for (size_t i = 0; i < m_Mult.bSize; i++) {
		output.bools[i] = output.bools[i] && m_Mult.bools[i];
	}
	for (size_t i = 0; i < m_Mult.iSize; i++) {
		output.ints[i] *= m_Mult.ints[i];
	}
	for (size_t i = 0; i < m_Mult.fSize; i++) {
		output.floats[i] *= m_Mult.floats[i];
	}
	for (size_t i = 0; i < m_Mult.dSize; i++) {
		output.doubles[i] *= m_Mult.doubles[i];
	}
}

const string& MultOp::_frameOperatorID() const {
	return OpId::mult_op;
}

void MultOp::_serialize(ostream& binaryStream) const {
	m_Mult.serialize(binaryStream);
}
